Skip to main content

项目模板下载存储存入缓存

本节的主要内容为项目模版的安装

// commands/init/lib/index.js
async downloadTemplate(){
const {projectTemplate} = this.projectInfo
const templateInfo = this.template.find(item=> item.npmName === projectTemplate)
const targetPath = path.resolve(userHome,'.cloudscope-cli','template')
const storeDir = path.resolve(userHome,'.cloudscope-cli','template','node_modules')
const {npmName,version} = templateInfo
const templatePkg = new Package({
targetPath,
storeDir,
packageName:npmName,
packageVersion:version
})
if(await templatePkg.exists()){
// 更新package
log.verbose('更新template')
await templatePkg.update();
}else{
// 安装package
log.verbose('安装template')
await templatePkg.install();
}
}

通过spinner实现命令行loading效果

首先在utils/utils中添加spinnerStart和sleep方法

// utils/utils/lib/index.js

function spinnerStart(msg,spinnerString ='|\-\\'){
const Spinner = require('cli-spinner').Spinner
const spinner = new Spinner(`${msg} %s`)
spinner.setSpinnerString(spinnerString)
spinner.start()
return spinner
}

function sleep(timeout = 1000){
return new Promise(resolve => setTimeout(resolve,timeout))
}

然后在commands/init/lib/index.js中将spinner引入使用、测试。

/**
* 1. 通过项目模板API获取项目模板信息
* 1.1 通过egg.js搭建一套后端系统
* 1.2 通过npm存储项目模板(vue-cli/vue-element-admin)
* 1.3 将项目模板信息存储到mongodb数据库中
* 1.4 通过egg.js获取mongodb中的数据并且通过API返回
*/
async downloadTemplate() {
// console.log(this.projectInfo, this.template);
const { projectTemplate } = this.projectInfo
const templateInfo = this.template.find(item => item.npmName === projectTemplate)
const targetPath = path.resolve(userHome, '.cli-dev-zy', 'template')
const storeDir = path.resolve(userHome, '.cli-dev-zy', 'template', 'node_modules')
const { npmName, version } = templateInfo
const templateNpm = new Package({
targetPath,
storeDir,
packageName: npmName,
packageVersion: version
})
if (!await templateNpm.exists()) {
const spinner = spinnerStart('正在下载安装模板...')
await sleep()
try {
await templateNpm.install()
log.success('下载模板成功')
} catch (e) {
throw e
} finally {
spinner.stop(true)
}
} else {
const spinner = spinnerStart('正在下载更新模板...')
await sleep()
try {
await templateNpm.update()
log.success('更新模板成功')
} catch (e) {
throw e
} finally {
spinner.stop(true)
}
}
}
// 下载模板
async downloadTemplate() {
const { projectTemplate } = this.projectInfo
this.templateInfo = this.template.find(item => item.npmName === projectTemplate)
const targetPath = path.resolve(userHome, '.weilai-cli', 'template')
const storePath = path.resolve(userHome, '.weilai-cli', 'template', 'node_modules')
const { npmName: packageName, version: packageVersion } = this.templateInfo
const templateNpm = this.templateNpm = new Package({
targetPath,
storePath,
packageName,
packageVersion
})

// 判断 package 是否存在
let flag = await templateNpm.exists()
const spinner = spinnerStart('正在下载模板...')
await sleep()
try {
if(!flag) {
// 不存在 安装
await templateNpm.install()
} else {
// 存在 更新
await templateNpm.update()
}
} catch (e) {
throw e
} finally {
spinner.stop(true)
flag ? log.success('更新模板成功') : log.success('下载模板成功')
}
}